package pattern

import (
	"fmt"
	"strconv"
)

// 定义接口，结构体实现接口
type HandlerI interface {
	Handle(handlerId int)
}

type handler struct {
	name      string
	next      HandlerI
	handlerId int
}

func NewHandler(name string, next HandlerI, handlerId int) *handler {
	return &handler{
		name:      name,
		next:      next,
		handlerId: handlerId,
	}
}

func (h *handler) Handle(handlerId int) {
	if h.handlerId == handlerId {
		fmt.Println(h.name + "登录了" + strconv.Itoa(handlerId))
	} else {
		// 查找当前结构体的结构体（next）的Handle方法，就可以接着往下处理
		h.next.Handle(handlerId)
	}
}

// 定义结构体，里面内嵌下一个结构体，也是调用链
// weibo := NewHandler("weibo", nil, 3)
// qq := NewHandler("qq", weibo, 2)
// weixin := NewHandler("weixin", qq, 1)

// weixin.Handle(3)
// weibo.Handle(3)
